---@class GT.point 点
---@field point Point 点
---@field x number x
---@field y number y
---@field z number z
GT.point = class()

---@class point_data
---@field point Point 点
---@field x number x
---@field y number y
---@field z number z


function GT.point:ctor(data)
    self.point = data.point
    self.x=self:get_point_x()
    self.y=self:get_point_y()
    self.z=self:get_point_z()
end

---转对象
---@param point Point
---@return GT.point
function GT.point.obj(point)
    return new(GT.point, { point = point })
end

--- 通过资源id返回点
---@param res_id Int32 资源ID
---@return FPoint
function GT.point.get_point_by_res_id(res_id)
    return GT.point.obj( game_api.get_point_by_res_id(res_id))
end

---获取点的x坐标
function GT.point:get_point_x()
    return globalapi.get_fixed_coord_index(self.point, 0):int()
end

---获取点的y坐标
function GT.point:get_point_y()
    return globalapi.get_fixed_coord_index(self.point, 2):int()
end

---获取点的z坐标
function GT.point:get_point_z()
    return globalapi.get_fixed_coord_index(self.point, 1):int()
end

---坐标转化为点
---@param x number 点X坐标
---@param y number 点Y坐标
---@param z number 点z坐标
---@return GT.point
function GT.point.vec3(x, y, z)
    return GT.point.obj( globalapi.coord_to_point(Fix32(x), Fix32(y), Fix32(z or 0)))
end

--- 点是否存在
---@param point GT.point 点X坐标
---@return Bool
function GT.point.point_is_exist(point)
    return global_api.point_is_exist(point.point)
end



---点向方向偏移
---@param direction number 偏移方向点
---@param offset point 偏移量
---@return GT.point
function GT.point:set(direction, offset)
    return GT.point.obj(global_api.get_point_offset_vector(self.point,direction, Fix32(offset)))
end


--- 设置点碰撞
---@param is_add Bool 添加/去除
---@param ground_channel Bool 地面碰撞
---@param air_channel Bool 飞行碰撞
function GT.point:set_point_collision(is_add, ground_channel, air_channel)
    game_api.set_point_collision(self.point, is_add, ground_channel, air_channel)
end

--- 判断点是否在正方形内
---@param center FVector3 中心点
---@param width Fixed 正方形边长
---@return Bool
function GT.point:judge_point_in_rec(center, width)
    return game_api.judge_point_in_rec(self.point, center, width)
end

--- 获取当前点的碰撞类型
---@return Int32
function GT.point:get_point_ground_collision()
    return game_api.get_point_ground_collision(self.point)
end

--- 获取当前点的视野隔断类型
---@return Int32
function GT.point:get_point_view_block_type(point)
    return game_api.get_point_view_block_type(self.point)
end

--- 开关目标点的草丛
---@param enable Bool 开关
function GT.point:set_grass_enable_by_pos(enable)
    game_api.set_grass_enable_by_pos(enable,self.point)
end

--- 修改某点的地形纹理
---@param texture_type Int32 纹理类型
---@param radius Int32 范围
---@param area_shape Int32 区域类型
function GT.point:modify_point_texture(texture_type,radius,area_shape)
    game_api.modify_point_texture(self.point,texture_type,radius,area_shape)
end


--- 检测点是否和单位碰撞
---@param unit GT.unit 单位
---@param radius Float 范围
---@return Bool
function GT.point:unit_can_collide_with_point(unit,radius)
    return game_api.unit_can_collide_with_point(unit.unit,self.point,radius)
end


--- 检查点到点是否联通
---@param unit GT.unit 寻路单位
---@param pointb GT.point 终点
---@return Bool
function GT.point:can_point_reach_point(unit,pointb)
    return game_api.can_point_reach_point(unit.unit,self.point,pointb.point)
end

--- 获取不同形状范围内的可破坏物列表
---@param shape Shape 形状
---@return List
function  GT.point:get_all_dest_in_shapes(shape)
    return game_api.get_all_dest_in_shapes(self.point,shape)
end

--- 获取点范围内的可破坏物列表
---@param rng Float 半径
---@return List
function GT.point:get_all_dest_in_point_rng(rng)
    return game_api.get_all_dest_in_point_rng(self.point,rng)
end
